package ar.com.sebasoft.rembrandt.estructura;

import java.util.ArrayList;
import java.util.List;

public class ListaDoble {
	private NodoDoble primerNodo;

	private NodoDoble ultimoNodo;

	public ListaDoble() {
		this.primerNodo = null;
		this.ultimoNodo = null;
	}

	public void insertar(Comparable obj) {
		if (obj != null) {
			NodoDoble aux = this.primerNodo;
			if (aux != null) {
				while (aux != null) {
					if (aux.dato.compareTo(obj) > 0) {
						NodoDoble nuevo = new NodoDoble(obj, aux, aux.siguiente);
						if (aux.siguiente != null) {
							aux.siguiente.anterior = nuevo;
						}
						aux.siguiente = nuevo;
						break;
					}
					if (aux.siguiente == null) {
						this.insertarAlFinal(obj);
						break;
					} else {
						aux = aux.siguiente;
					}
				}
			} else {
				this.insertarAlInicio(obj);
			}
		}
	}

	public void insertarAlInicio(Comparable dato) {
		if (this.primerNodo == null) {
			this.primerNodo = new NodoDoble(dato, null, null);
			this.ultimoNodo = this.primerNodo;
		} else {
			NodoDoble aux = new NodoDoble(dato, null, this.primerNodo);
			this.primerNodo.anterior = aux;
			this.primerNodo = aux;
		}
	}

	public void insertarAlFinal(Comparable dato) {
		if (this.primerNodo == null) {
			this.ultimoNodo = new NodoDoble(dato, null, null);
			this.primerNodo = this.ultimoNodo;
		} else {
			NodoDoble aux = new NodoDoble(dato, this.ultimoNodo, null);
			this.ultimoNodo.siguiente = aux;
			this.ultimoNodo = aux;
		}
	}

	public Comparable extraerAlInicio() {
		try {
			Comparable dato = this.primerNodo.dato;
			this.primerNodo = this.primerNodo.siguiente;
			if (this.primerNodo != null) {
				this.primerNodo.anterior = null;
			} else {
				this.ultimoNodo = null;
			}
			return dato;
		} catch (Exception e) {
			return null;
		}
	}

	public Comparable extraerAlFinal() {
		try {
			Comparable dato = this.ultimoNodo.dato;
			this.ultimoNodo = this.ultimoNodo.anterior;
			if (this.ultimoNodo != null) {
				this.ultimoNodo.siguiente = null;
			} else {
				this.primerNodo = null;
			}
			return dato;
		} catch (Exception e) {
			return null;
		}
	}

	public Comparable buscar(Comparable aguja) {
		Comparable res = null;
		if (aguja != null) {
			NodoDoble aux = this.primerNodo;
			String strAguja = aguja.toString();
			while (aux != null) {
				String strPajar = aux.dato.toString();
				if (strPajar.equals(strAguja)) {
					res = aux.dato;
					break;
				}
				aux = aux.siguiente;
			}
		}
		return res;
	}

	public List<Comparable> obtenerLista() {
		List<Comparable> res = new ArrayList<Comparable>();
		if (this.primerNodo != null) {
			NodoDoble aux = this.primerNodo;
			while (aux != null) {
				res.add(aux.dato);
				aux = aux.siguiente;
			}
		}
		return res;
	}
}
